Zavirani childoken v MDI aplikaci.
Otázka od: Ing. Igor Vodička
14. 10. 2002 11:03
Zdravim vsechny delfisty.
Muze mi nekdo poradit nebo nakopnout s jednou veci.
Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
snizen o pocet prave zavrenych oken.
Jak to provest, aby se v aplikaci okamzite po zavreni childokna aktualizoval
celkovy pocet MDIchildoken.
Predem dik za rady
Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.401 / Virová báze: 226 - datum vydání: 9.10.2002
Odpovedá: CERMAK
14. 10. 2002 17:19
Neni problem spise v pouziti cyklu for. Mam takovy pocit, ze je prelozen
tak, ze si program spocita pocet opakovani a pak bezi bez ohledu na to, jak
se uvnitr cyklu meni meze. Zkusil bych pouzit cyklus while.
Jaromir Cermak
-----Original Message-----
From: Ing. Igor Vodička [mailto:vodicka@sagit.cz]
Sent: Monday, October 14, 2002 10:09 AM
To: Delphi konference II
Subject: Zavirani childoken v MDI aplikaci.
Zdravim vsechny delfisty.
Muze mi nekdo poradit nebo nakopnout s jednou veci.
Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
snizen o pocet prave zavrenych oken.
Odpovedá: ing. Jan Fiala
14. 10. 2002 11:44
To neni cyklem. MDIChildCount se nemeni okamzite. Taky jsem na to
narazil. Nastesti mam v programu i zalozky, takze jsem se prestal
ridit pomoci MDIChildCount a zacal jsem se ridit podle zalozek, ktere
se vytvari a zanikaji s child oknem.
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
14.10.2002 CERMAK:
> Neni problem spise v pouziti cyklu for. Mam takovy pocit, ze je prelozen
> tak, ze si program spocita pocet opakovani a pak bezi bez ohledu na to, jak
> se uvnitr cyklu meni meze. Zkusil bych pouzit cyklus while.
Odpovedá: Michal Sefcik
14. 10. 2002 17:49
Jednoduse to proved takto:
while MDIChildCount > 0 do
MDIChildren[0].Free;
> Muze mi nekdo poradit nebo nakopnout s jednou veci.
> Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
> Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
MDIChildCount vraci pocet oken spravne, problem muze byt spise v naslednem
pouziti promenne I a indexovani Child oken ???
Odpovedá: Jan Sebelík
14. 10. 2002 23:11
> Odesílatel: Ing. Igor Vodička <vodicka@sagit.cz>
> Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
> Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
> provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
> childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
> snizen o pocet prave zavrenych oken.
Je to pruzracne, pokud se podivame na metodu Close do zdrojaku.
Close okno fakticky nezavre, jenom posle aplikaci message.
for i:=0 to MDIChildCount-1 do
MDIChildren[i].Close;
tedy probehne pro vsechna okna, ve fronte zprav je prislusny pocet messages,
okna ale ve skutecnosti zavrena jeste nejsou, MDIChildCount se tedy opravnene
nemeni. Po ukonceni procedury si aplikace "slizne" messages a okna se
pozaviraji.
Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem rikal:
for i:=0 to MDIChildCount-1 do begin
MDIChildren[i].Close;
Application.ProcessMessages;
...
V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na Access
Violation (nebo neco podobneho), protoze v cyklu prelezu pres puvodni
MDIChildCount.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
Odpovedá: ing. Jan Fiala
15. 10. 2002 5:01
14.10.2002 Jan Sebelík:
> Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem
rikal:
> for i:=0 to MDIChildCount-1 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;
> ...
> V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na
> Access Violation (nebo neco podobneho), protoze v cyklu prelezu pres
> puvodni MDIChildCount.
Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus
for i:=MDIChildCount-1 downto 0 do begin
MDIChildren[i].Close;
Application.ProcessMessages;
--
Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Jan Sebelík
15. 10. 2002 9:56
> Odesílatel: ing. Jan Fiala <jan.fiala@iol.cz>
> Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus
> for i:=MDIChildCount-1 downto 0 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;
Ale vzdyt jsem psal, ze reseni
> > for i:=0 to MDIChildCount-1 do begin
> > MDIChildren[i].Close;
> > Application.ProcessMessages;
vede k Access Violation.
Je to jenom ukazka, ktera ucastnikum "Zakladniho kurzu Delphi" vyjasni
mechanismus posilani zprav.
Bez toho ProcessMessages to funguje i bez "downto", s ProcessMessages
samozrejme ne.
A o to jde...
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
----------
> Odesílatel: ing. Jan Fiala <jan.fiala@iol.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: Re: Zavirani childoken v MDI aplikaci.
> Datum: 15. října 2002 6:00
>
> 14.10.2002 Jan Sebelík:
> > Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem
rikal:
>
> > for i:=0 to MDIChildCount-1 do begin
> > MDIChildren[i].Close;
> > Application.ProcessMessages;
> > ...
>
> > V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na
> > Access Violation (nebo neco podobneho), protoze v cyklu prelezu pres
> > puvodni MDIChildCount.
>
> Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus
>
> for i:=MDIChildCount-1 downto 0 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;
>
> --
> Jan Fiala
> mailto:jan.fiala@iol.cz
Odpovedá: ing. Jan Fiala
15. 10. 2002 20:52
15.10.2002 Jan Sebelík:
> Ale vzdyt jsem psal, ze reseni
>> > for i:=0 to MDIChildCount-1 do begin
>> > MDIChildren[i].Close;
>> > Application.ProcessMessages;
> vede k Access Violation.
> Je to jenom ukazka, ktera ucastnikum "Zakladniho kurzu Delphi" vyjasni
mechanismus posilani zprav.
> Bez toho ProcessMessages to funguje i bez "downto", s ProcessMessages
samozrejme ne.
> A o to jde...
Mozna je to taky tim, jak se k tomu postavi kompilator. Pokud
promennou v cyklu nevyuzivas, optimalizator cyklus obrati. Mozna
Application.ProcessMessages zpusobi, ze k obraceni nedojde a pak to
skonci na Access Violation. Ale to by se chtelo povrtat ve vyslednem
strojovem kodu...
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Petr Vones
15. 10. 2002 21:21
From: "ing. Jan Fiala" <jan.fiala@iol.cz>
> promennou v cyklu nevyuzivas, optimalizator cyklus obrati. Mozna
> Application.ProcessMessages zpusobi, ze k obraceni nedojde a pak to
Application.ProcessMessages hlavne zpusobi naprosty zmatek, protoze se zpravy
zacnou vyrizovat v kodu, ktery byl take spusten z Application.ProcessMessages
atd ...
Petr Vones